package cn.smile.utils;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists;
import org.springframework.beans.BeanUtils;

import java.util.List;
import java.util.Objects;

/**
 * @author admin
 */
public class BeanCopy {

    /**
     * 复制 MyBatisPlus 的 IPage 对象
     *
     * @param source MyBatisPlus 的分页对象
     * @param clazz  实体对象 class 类
     * @param <T1>   查询结果翻页对象的泛型
     * @param <T2>   复制结果翻页对象的泛型
     * @return 复制结果对象
     */
    public static <T1, T2> IPage<T2> copyPage(IPage<T1> source, Class<T2> clazz) {
        if (Objects.isNull(source)) {
            return new Page<>();
        } else {
            IPage<T2> res = new Page<>();
            res.setRecords(copyList(source.getRecords(), clazz));
            res.setTotal(source.getTotal());
            res.setCurrent(source.getCurrent());
            return res;
        }
    }

    /**
     * 复制列表对象
     *
     * @param sources 需要复制的列表对象
     * @param clazz   复制后的对象
     * @param <T1>    复制前的泛型
     * @param <T2>    复制后的泛型
     * @return 复制后的新列表对象
     */
    public static <T1, T2> List<T2> copyList(List<T1> sources, Class<T2> clazz) {
        List<T2> res = Lists.newArrayList();
        if (!CollectionUtils.isEmpty(sources)) {
            sources.forEach(source -> res.add(copyBean(source, clazz)));
        }
        return res;
    }

    /**
     * @param source 需要复制的对象
     * @param clazz  复制后的对象class
     * @param <T>    复制后的泛型对象
     * @return 复制后的结果
     */
    public static <T> T copyBean(Object source, Class<T> clazz) {
        T t = BeanUtils.instantiateClass(clazz);
        if (!Objects.isNull(source)) {
            BeanUtils.copyProperties(source, t);
        }
        return t;
    }
}
